home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d12
/
vol6n20.arc
/
INLINE.ARC
/
INLINE.DOC
< prev
next >
Wrap
Text File
|
1987-10-31
|
14KB
|
397 lines
March 30, 1987
INLINE ASSEMBLER
Version 2.14
OVERVIEW
INLINE.COM is an assembler designed to produce Inline 8086/8088
and 8087 code for Turbo Pascal (tm) version 3 programs. Like
other assemblers, INLINE accepts as input an assembly language
source file and produces an object file. However, in this case,
the 'object' file is an ASCII file consisting of Inline
statements which may be inserted into the Turbo Pascal program.
Figure 1 illustrates a Pascal function with Inline code generated
by INLINE using the source file of Figure 2.
LOADING AND RUNNING INLINE
First create a COM file, INLINE.COM, by compiling INLINE.PAS
using the Turbo Pascal compiler. The normal default memory
settings are suitable.
INLINE is called at the DOS prompt with two filename parameters
specifying the names of the source and object files. If no
extensions are given, .ASM and .OBJ are used by default. For
instance,
INLINE ABC DEF
will cause INLINE to look for a source file, ABC.ASM, and create
an object file, DEF.OBJ. Files with no extension may be input or
created by using a simple '.' for the extension.
If the object filename is missing from the command line, an OBJ
file will be created using the same name as the source file. If
neither filename is specified, then names will be requested once
execution starts.
Once execution begins, INLINE will run to completion with the
only console output being error messages.
SYNTAX
The appendix lists the mnemonics accepted by INLINE. Syntax and
mnemonics correspond to that used by most assemblers but note
should be made of the following:
1
1. Turbo Pascal symbols may be used within instruction entries
by preceding the symbol with a '>' (16 bit symbol) or a '<'
(8 bit symbol). The characters '+' and '-' are considered
part of the symbol. This allows computations using symbols
to be passed on to the compiler where the computation can be
made. For instance, in
MOV AX,[>SYMBOL+4] ;'>SYMBOL+4' is passed on
MOV AX,[BP+>SYMBOL+4] ;again '>SYMBOL+4' is passed on
MOV AX,>SYMBOL+4[BP] ;also acceptable
Note that
MOV AX,[>SYMBOL+4+BP]
is not correct since the wrong instruction will be generated
and '>SYMBOL+4+BP' will be passed on.
2. Labels (for use with jump instructions) may be defined
simply by appending a ':' to the first item on a line.
Avoid using CS:, DS:, ES:, and SS: as labels, as these
specify segment overrides.
3. Numerical entries are assumed to be decimal unless preceded
by a '$' indicating a hexadecimal entry. Characters within
single quotes may be used for numerical entries as:
CMP AL,'a'
4. Square brackets are used to indicate 'contents of'. If no
square brackets are used, an immediate operand is assumed.
MOV AX,[>DATA] ;Load AX with the contents of DATA.
MOV AX,>DATA ;Load AX with DATA.
5. Instruction prefixes and segment override prefixes may
precede the instruction on the same line or may be included
on a previous line. A colon is optional after the segment
prefix.
ES: MOV AX,[1234] ;ok
REPNE MOVSB ;ok
MOV AX,ES:[1234] ;incorrect syntax for INLINE
6. Comments may be included in the source. They are delimited
by a ';'.
7. Instructions which don't clearly specify the data size
require that BYTE PTR, WORD PTR, DWORD PTR, QWORD PTR, or
TBYTE PTR be used. These may be abbreviated by using the
first two letters.
2
INC BYTE PTR [>BDATA]
DEC WO >WARRAY[DI]
FLD QWORD [>DBL_REAL]
8. JMP instructions may use SHORT, NEAR, or FAR (they should
not be abbreviated). In the absence of one of these words,
a SHORT jump will be encoded if the label is already defined
and is within range. If the label is not defined, a NEAR
JMP will be encoded unless SHORT is used.
A FAR CALL or JMP may be made to a direct address by stating
both the segment and offset separated by a colon.
CALL FAR $1234:$5678
Direct CALL's or JMP's may be made to other Turbo procedures
and functions using symbolic names. The '*' location
counter reference is required to allow Turbo to determine
the correct displacement, as:
CALL >PROCNAME-*-2
Null JMP's which may be required for delay between port
calls on the 80286, may be made as;
JMP >0 ;or
JMP SHORT <0
Normally INLINE generates only one Inline statement per source
file. However, the 'NEW' pseudo-instruction may be used to
terminate one Inline statement and begin another. Using the NEW
instruction, it is possible to create a number of Inline
statements from one source file.
FLOATING POINT INSTRUCTIONS
An automatic WAIT (FWAIT) opcode is generated for each floating
point instruction except for the 'no wait' instructions (those
with 'N' for the second letter. However, the WAIT instruction
may be required before a floating point instruction having a
segment override to insure the WAIT is properly positioned.
WAIT
ES:FMUL DWORD [BX]
3
RESTRICTIONS
The object file is limited to 32k. This includes comments and
spaces.
Symbols (including any addons from + and -) are limited to 32
characters.
Labels may be used in jump statements only and not as data
references. While there is a DB pseudo-opcode, it is not very
useful with this restriction.
The number of statement labels that may be defined is limited
only by the heap space available.
VERSIONS
2.00 Added 8087 instructions.
2.01 Fixed bug which wiped out INT $A vector.
2.02 Fixed bug which prevented labels from starting with BY, WO,
DW, QW, and TB.
2.1 Add NEW pseudo-instruction. Fixed bug which occurred with
filenames having no extension. Other bugs fixed, notably
those effecting IN and OUT.
2.11 Calculate restricted range for short jumps correctly.
Fix bug so CALL/JMP <register> may be used.
2.12 Allow CALL and JMP direct instructions.
2.13 Allow JMP >0 and JMP SHORT <0 for null JMP's.
2.14 Change output format to better sync with TMAP's line
numbers.
(C) Copyright 1985,86,87 by L. David Baldwin.
INLINE may be copied and distributed freely providing that no fee
is charged and it is not part of a package for which a charge is
made.
Please report all bugs, suggestions, and problems to Dave
Baldwin, CompuServe ID #76327,53.
22 Fox Den Rd., (Summer) 144 13th St. East, (Winter)
Hollis, NH 03049 Tierra Verde, FL 33715
(603) 465-7857 (813) 867-3030
Turbo Pascal is a trademark of Borland International Inc.
4
FUNCTION Scan(Limit :Integer; Ch :Char; Var T ): Integer;
{Scan limit characters for Ch. Return the number of characters
skipped to find a match. If not found, return result=Limit.
Limit may be negative for a backwards scan.}
BEGIN {Use assembly language for speed}
Inline(
$FC/ { cld ;assume forward}
$8A/$46/<CH/ { mov al,<Ch[bp] ;char to search for}
$8B/$4E/<LIMIT/ { mov cx,<Limit[bp];bytes to search}
$09/$C9/ { or cx,cx ;check sign}
$9C/ { pushf ;save flags}
$79/$03/ { jns x1}
$F7/$D9/ { neg cx ;make positive}
$FD/ { std ;but search in reverse}
$89/$CA/ {x1: mov dx,cx ;save full count}
$C4/$7E/<T/ { les di,<T[bp] ;ptr to start}
$F2/$AE/ { repne: scasb ;search}
$75/$01/ { jne x2}
$41/ { inc cx ;found a match}
$29/$CA/ {x2: sub dx,cx ;find count to match}
$9D/ { popf}
$79/$02/ { jns x3}
$F7/$DA/ { neg dx ;make negative if reverse}
$89/$56/$0C); {x3: mov [bp+$C],dx ;put in function result}
END;
Figure 1: Pascal Function using Inline Code
cld ;assume forward
mov al,<Ch[bp] ;char to search for
mov cx,<Limit[bp];bytes to search
or cx,cx ;check sign
pushf ;save flags
jns x1
neg cx ;make positive
std ;but search in reverse
x1: mov dx,cx ;save full count
les di,<T[bp] ;ptr to start
repne: scasb ;search
jne x2
inc cx ;found a match
x2: sub dx,cx ;find count to match
popf
jns x3
neg dx ;make negative if reverse
x3: mov [bp+$C],dx ;put in function result
Figure 2: INLINE Input File
5
APPENDIX
8086/8088 Opcode Mnemonics Recognized by INLINE
AAA HLT JNE LOOPNZ ROR
AAD IDIV JNG LOOPZ SAHF
AAM IMUL JNGE MOV SAL
AAS IN JNL MOVSB SAR
ADC INC JNLE MOVSW SBB
ADD INT JNO MUL SCASB
AND INTO JNP NEG SCASW
CALL IRET JNS NOP SHL
CBW JA JNZ NOT SHR
CLC JAE JO OR SS
CLD JB JP OUT STC
CLI JBE JPE POP STD
CMC JC JPO POPF STI
CMP JCXZ JS PUSH STOSB
CMPSB JE JZ PUSHF STOSW
CMPSW JG LAHF RCL SUB
CS JGE LDS RCR TEST
CWD JL LEA REP WAIT
DAA JLE LES REPE XCHG
DAS JMP LOCK REPNE XLAT
DB JNA LODSB REPNZ XOR
DEC JNAE LODSW REPZ
DIV JNB LOOP RET
DS JNBE LOOPE RETF
ES JNC LOOPNE ROL
8087 Opcode Mnemonics Recognized by INLINE
F2XM1 FDIVRP FLD FNOP FSTP
FABS FENI FLD1 FNSAVE FSTSW
FADD FFREE FLDCW FNSTCW FSUB
FADDP FIADD FLDENV FNSTENV FSUBP
FBLD FICOM FLDL2E FNSTSW FSUBR
FBSTP FICOMP FLDL2T FPATAN FSUBRP
FCHS FIDIV FLDLG2 FPREM FTST
FCLEX FIDIVR FLDLN2 FPTAN FXAM
FCOM FILD FLDPI FRNDINT FXCH
FCOMP FIMUL FLDZ FRSTOR FXTRACT
FCOMPP FINCSTP FMUL FSAVE FYL2X
FDECSTP FINIT FMULP FSCALE FYL2XP1
FDISI FIST FNCLEX FSQRT FWAIT
FDIV FISTP FNDISI FST
FDIVP FISUB FNENI FSTCW
FDIVR FISUBR FNINIT FSTENV
6